import { MCPClient } from "./mcpClient";
import * as vscode from 'vscode';
import { HarmonyPilotGUIWebviewViewProvider } from "../../src/HarmonyPilotGUIWebviewViewProvider";
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { MCPConfig } from "./mcpConfig";
import type { Tool } from '@anthropic-ai/sdk/resources/messages/messages.mjs';

export class MCPClientAndProvider {
    private mcpClient: MCPClient;
    private sidebar: HarmonyPilotGUIWebviewViewProvider;
    private mcpConfigWatcher: vscode.Disposable | undefined;
    private mcpJsonPath: string;


    constructor(context: vscode.ExtensionContext, mcpClient: MCPClient, sidebar: HarmonyPilotGUIWebviewViewProvider) {
        this.mcpClient = mcpClient;
        this.sidebar = sidebar;
        this.mcpJsonPath = this.initHarmonyPilotConfig();
        this.watchMcpConfigFile(context);
        this.handleMcpConfigChange();
    }

    /**
     * 刷新MCP工具列表并发送到webview
     * 这个方法用于响应webview的主动请求
     */
    public async refreshMcpTools(): Promise<void> {
        await this.handleMcpConfigChange();
    }

    /**
     * 发送MCP配置到webview
     * @param config MCP配置对象
     */
    private sendMcpConfigToWebview(tools: Tool[]): void {
        // 如果webview已初始化
        if (this.sidebar && this.sidebar.webviewProtocol) {
            // 发送配置到webview
            this.sidebar.webviewProtocol.send('mcpToolsUpdated', {
                tools,
                timestamp: new Date().getTime()
            });
        }
    }

    /**
     * 处理mcp.json文件变化
     */
    private async handleMcpConfigChange(): Promise<void> {
        try {
            // 读取mcp.json文件内容
            const fileContent = fs.readFileSync(this.mcpJsonPath, 'utf-8');
            
            // 将内容转为mcpConfig对象
            const mcpConfig = JSON.parse(fileContent) as MCPConfig;

            // 清空工具映射
            this.mcpClient.toolToClientMap.clear();

            // 连接MCP服务器并获取工具列表
            const tools = await this.mcpClient.connectToMcpServer(mcpConfig);

            if (tools.length > 0) {
                this.sendMcpConfigToWebview(tools);
            }
        } catch (error) {
            console.error('读取或处理mcp.json失败:', error);
            vscode.window.showErrorMessage(`无法读取或处理mcp.json: ${error}`);
        }
    }

    /**
     * 监听mcp.json文件变化
     * @param context 扩展上下文
     */
    private watchMcpConfigFile(context: vscode.ExtensionContext): void {
        // 使用文档保存事件
        this.mcpConfigWatcher = vscode.workspace.onDidSaveTextDocument((document) => {
        // 规范化路径并进行不区分大小写的比较
        const isRelatedPath = path.relative(this.mcpJsonPath, document.uri.fsPath) === '';
        
        if (isRelatedPath) {
            this.handleMcpConfigChange();
        }
    });
        
        // 添加到订阅中，以便在扩展停用时自动清理
        context.subscriptions.push(this.mcpConfigWatcher);
    }

    /**
     * 初始化 .harmonypilot 目录和 mcp.json 文件
     * @returns mcp.json文件路径
     */
    private initHarmonyPilotConfig(): string {
        try {
            // 获取用户主目录
            const homeDir = os.homedir();
            const harmonyPilotDir = path.join(homeDir, '.harmonypilot');
            const mcpJsonPath = path.join(harmonyPilotDir, 'mcp.json');
            
            // 如果目录不存在，创建目录
            if (!fs.existsSync(harmonyPilotDir)) {
                fs.mkdirSync(harmonyPilotDir, { recursive: true });
                console.log('创建 .harmonypilot 目录成功');
            }
            
            // 如果 mcp.json 不存在，创建文件
            if (!fs.existsSync(mcpJsonPath)) {
                // 默认配置
                const defaultConfig = {
                    mcpServers: {}
                };
                
                fs.writeFileSync(mcpJsonPath, JSON.stringify(defaultConfig, null, 2), 'utf-8');
                console.log('创建 mcp.json 文件成功');
            }
            
            // 验证文件创建成功
            if (!fs.existsSync(mcpJsonPath)) {
                throw new Error('无法创建 mcp.json 文件');
            }
            
            return mcpJsonPath;
        } catch (error) {
            console.error('初始化 .harmonypilot 配置失败:', error);
            // 通知用户发生错误
            vscode.window.showErrorMessage(`初始化 .harmonypilot 配置失败: ${error}`);
            return '';
        }
    }
    
} 